import {defineConfig, loadEnv} from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import {fileURLToPath} from 'url'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import {
    AntDesignVueResolver
} from 'unplugin-vue-components/resolvers'
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import {createSvgIconsPlugin} from 'vite-plugin-svg-icons'
import compression from 'vite-plugin-compression';


const __filenameNew = fileURLToPath(import.meta.url)
const __dirnameNew = path.dirname(__filenameNew)


const viteConfig = defineConfig(({command, mode}) => {
    const env = loadEnv(mode, process.cwd() + "\\env", '');
    return {
        base: env.ENV_BASE_PATH,
        build: {
            outDir: "../admin/src/main/resources/static/admin",
            chunkSizeWarningLimit: 1024 * 1024 * 5,
        },
        define: {
            // 定义 Vue 3 特性标志
            __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true,
            // 其他常用标志（根据需要添加）
            __VUE_OPTIONS_API__: true,
            __VUE_PROD_DEVTOOLS__: false,
        },
        // 解析
        resolve: {
            // 别名
            alias: {
                "@": path.resolve(__dirnameNew, "src"),
            },
        },

        optimizeDeps: {
            // 将指定数组中的依赖不进行依赖预构建
            exclude: []
        },
        // 环境的默认目录
        envDir: "env",
        // 把默认的 VITE_ 换成我们自定义的前缀
        envPrefix: "ENV_",
        // 设置代理
        server: {
            host: '0.0.0.0',
            port: 3000,
            proxy: {
                '/api': {
                    target: env.ENV_URL,
                    changeOrigin: true,
                    rewrite: (path) => path.replace(/^\/api/, '')
                },
            }
        },
        css: {
            preprocessorOptions: {
                scss: {
                    api: 'modern-compiler',
                    additionalData: '@use "@/assets/style/main" as *;'
                },
            }
        },
        plugins: [
            vue(),
            Components({
                resolvers: [
                    AntDesignVueResolver({
                        importStyle: 'less', // v4推荐使用less
                        resolveIcons: true // 配置自动识别图标，开启后，写 ant-icon 会自动按需导入
                    }),
                    IconsResolver()
                ]
            }),
            AutoImport({
                // 注册全局导入
                imports: [
                    'vue',
                    'vue-router',
                    'pinia',
                    'vue-i18n',
                    {
                        '@vueuse/core': [
                            // import { useMouse } from '@vueuse/core',
                            'useMouse',
                            // import { useFetch as useMyFetch } from '@vueuse/core',
                            // alias
                            ['useFetch', 'useMyFetch'],
                        ],
                        'axios': [
                            // import { default as axios } from 'axios',
                            // default imports
                            ['default', 'axios'],
                        ]
                    },
                ],
                dirs: [
                    '@/components'
                ],
            }),
            createSvgIconsPlugin({
                iconDirs: [path.resolve(process.cwd(), 'src/assets/icon/svg')],
                symbolId: '[name]'
            }),
            Icons({
                compiler: 'vue3',
            }),
            // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
            compression({
                disable: false, // 是否禁用压缩功能，布尔值，true 表示不进行压缩，false 表示启用压缩。
                verbose: false, // 是否输出压缩日志
                algorithm: 'gzip', // 压缩算法：可选 'gzip', 'brotliCompress', 'deflate', 'deflateRaw'
                threshold: 1024, // 只处理大于此大小的文件（默认：1024）
                ext: '.gz', // 生成的压缩文件名后缀（默认：.gz）
                deleteOriginFile: false, // 压缩后是否删除原始文件，布尔值，true 会删除原文件，false 则保留
                // 用于过滤不需要压缩的文件（正则表达式） /\.(js|css|html|svg)$/i
                filter: /\.(js|css|html|svg)$/i,
                success: () => {} // 压缩完成后的成功回调函数，类型是无参数、无返回值的函数，可在压缩完毕后做一些自定义操作
            }),
        ]
    }
})


export default viteConfig;